10-抽象类 vs 接口:使用场景与对比笔记

1. 抽象类 vs 接口:使用场景与对比笔记

1.1. 🧱 总体原则:"继承复用 vs 行为契约"

用法目的 抽象类 接口
是为了 "是什么" ✅ 表示一类事物的本质(继承) ❌ 不适合
是为了 "能做什么" ❌ 不一定合适 ✅ 表示行为能力(行为契约)

1.2. 🔧 抽象类(abstract class)

1.2.1. ✅ 使用场景:

1.2.2. ✅ 特点:

1.2.3. 🧪 示例:

abstract class Animal {
    protected String name;

    public Animal(String name) {
        this.name = name;
    }

    public void eat() {
        System.out.println(name + " is eating.");
    }

    public abstract void speak();
}

1.3. 🧩 接口(interface)

1.3.1. ✅ 使用场景:

1.3.2. ✅ 特点:

1.3.3. 🧪 示例:

interface Payable {
    boolean pay(double amount);
}

interface Refundable {
    void refund(String orderId);
}

1.4. ✅ 总结对比表

特性 抽象类 接口
能否实例化 ❌ 不能 ❌ 不能
是否可以有构造函数 ✅ 可以 ❌ 不可以
是否可以包含字段 ✅ 可以(各种访问修饰符) ⚠️ 只能是常量 public static final
方法是否可以有实现 ✅ 可以 ✅ 可用 default (Java 8+)
是否支持多继承 ❌ 不支持(只能单继承) ✅ 支持(多接口实现)

1.5. 📌 快速记忆口诀:

抽象类:"我是什么" → 用于继承、统一基础逻辑
接口:"我能做什么" → 用于实现能力、行为扩展